package com.coffee.core;


import com.alibaba.fastjson2.*;

import java.util.List;
import java.util.Map;

/**
 * JSON工具类
 *
 * @author songkui
 * @date 2024/10/18
 */
public class JSONUtils {

    /**
     * 转换对象到JSON字符串
     *
     * @param object 对象
     * @return {@link String}
     */
    public static String toJson(Object object) {
        return JSON.toJSONString(object);
    }

    /**
     * 转json
     * 转换对象到JSON字符串
     *
     * @param object  对象
     * @param feature 特征 官方文档@link https://gitee.com/wenshao/fastjson2/wikis/Features_cn
     * @return {@link String}
     */
    public static String toJson(Object object, JSONWriter.Feature feature) {
        return JSON.toJSONString(object, feature);
    }

    /**
     * 转换JSON字符串到指定类型实体
     *
     * @param jsonString json字符串
     * @param clazz      clazz
     * @return {@link T}
     */
    public static <T> T parse(String jsonString, Class<T> clazz) {
        return JSON.parseObject(jsonString, clazz);
    }

    /**
     * 解析json
     *
     * @param jsonString json字符串
     * @return {@link JSONObject}
     */
    public static JSONObject parse(String jsonString) {
        return JSON.parseObject(jsonString);
    }

    /**
     * 转换api请求响应
     *
     * @param json json
     * @return {@link CoffeeResponse}<{@link T}>
     */
    public static <T> CoffeeResponse<T> parseResponse(String json, Class<T> clazz) {
        return JSON.parseObject(json, new TypeReference<CoffeeResponse<T>>(clazz) {}, JSONReader.Feature.IgnoreAutoTypeNotMatch);
    }

    /**
     * 转换JSON字符串到指定类型实体List
     *
     * @param json json字符串
     * @param clazz      clazz
     * @return {@link List}<{@link T}>
     */
    public static <T> List<T> parseArray(String json, Class<T> clazz) {
        return JSON.parseArray(json, clazz);
    }

    /**
     * 解析数组
     *
     * @param json json字符串
     * @return {@link JSONArray}
     */
    public static JSONArray parseArray(String json) {
        return JSON.parseArray(json);
    }

    /**
     * 解析map
     *
     * @param json json字符串
     * @return {@link Map}<{@link String}, {@link T}>
     */
    public static <T> Map<String, T> parseMap(String json) {
        return JSON.parseObject(json, new TypeReference<Map <String,T>>(){});
    }

    /**
     * 解析map
     *
     * @param jsonString json字符串
     * @param clazz      clazz
     * @return {@link Map}<{@link String}, {@link T}>
     */
    public static <T> Map<String, T> parseMap(String jsonString, Class<T> clazz) {
        return JSON.parseObject(jsonString, new TypeReference<Map<String, T>>(clazz){});
    }

}
